package tool;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * 命令行控制类
 */
public class CmdControl {
    /**
     * 命令类
     */
    static abstract public class Cmd{
        //命令的名称 描述
        private String name,message;
        /**
         * 构造一个命令
         * @param name
         * @param message
        */
        public Cmd(String name,String message)
        {
            this.name = name;
            this.message = message;
        }

        /**
            * 获得命令名称
            * @return
        */
        public String getName()
        {
            return name;
        }

        /**
            * 获得名称的描述内容
            * @return
        */
        public String getMessage()
        {
            return message;
        }

        /**
        * 抽象方法 执行具体的命令
        */
        abstract public void doFun();
        }
    private ArrayList<Cmd> cmds = new ArrayList<>();
    //控制的运行状态 true--运行 false--退出控制
    private boolean isRuning = true;
    /**
     * 构造方法
     */
    public CmdControl()
    {
        addCmd(new Cmd("h","帮助信息") {

            @Override
            public void doFun() {
                // TODO Auto-generated method stub
                System.out.println(showCmd());
            }
            
        });
        addCmd(new Cmd("exit","退出当前功能") {

            @Override
            public void doFun() {
                // TODO Auto-generated method stub
                exit();
            }
            
        });
    }
    /**
     * 退出控制
     */
    private void exit()
    {
        isRuning = false;
    }
    /**
     * 获得当前的输入内容
     * @return
     */
    static public String in()
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            return reader.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将一个命令添加到命令列表
     * @param cmd 命令对象
     */
    public void addCmd(Cmd cmd)
    {
        cmds.add(cmd);
    }

    /**
     * 系统运行循环监听输入内容
     */
    public void scanCmd()
    {
        while(isRuning)
        {
            System.out.println("输入行动指令(h查看所有行动命令):");
            String cmd = in();
            Iterator<Cmd> it = cmds.iterator();
            //判断命令是否正确
            boolean cmdIsRight = false;
            while(it.hasNext())
            {
                Cmd controlFun = it.next();
                if(controlFun.getName().equals(cmd))
                {
                    cmdIsRight = true;
                    controlFun.doFun();
                    break;
                }
                //System.out.println(""+controlFun.getCmdName()+" : "+controlFun.getCmdMessage());
            }

            if(!cmdIsRight)
            {
                System.out.println("命令错误");
            }
        }
    }
    /**
     * 显示所有的命令信息
     * @return 命令信息内容
     */
    private String showCmd()
    {
        String cmdMessage = "";
        Iterator<Cmd> it = cmds.iterator();
        while(it.hasNext())
        {
            Cmd cmd = it.next();
            cmdMessage+="命令:"+cmd.getName()+"  描述:"+cmd.getMessage()+"\n";
        }
        return cmdMessage;
    }
}
